From defe6a70945c93b65778dc65da35ae539fcc0d6d Mon Sep 17 00:00:00 2001 From: "kaf24@scramble.cl.cam.ac.uk" Date: Wed, 12 Jan 2005 15:00:14 +0000 Subject: [PATCH] bitkeeper revision 1.1159.170.91 (41e53b7eEag3oyhnsSlzeQJHgcNl0A) Yet another seg-fixup fix. I was wrong about opcodes A0 and A2. :-( --- xen/arch/x86/x86_32/seg_fixup.c | 31 ++++++++++--------------------- 1 file changed, 10 insertions(+), 21 deletions(-) diff --git a/xen/arch/x86/x86_32/seg_fixup.c b/xen/arch/x86/x86_32/seg_fixup.c index 9009971d26..cc4a97c195 100644 --- a/xen/arch/x86/x86_32/seg_fixup.c +++ b/xen/arch/x86/x86_32/seg_fixup.c @@ -75,7 +75,7 @@ static unsigned char insn_decode[256] = { X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, X, /* 0xA0 - 0xAF */ - O|1, O|4, O|1, O|4, X, X, X, X, + O|4, O|4, O|4, O|4, X, X, X, X, X, X, X, X, X, X, X, X, /* 0xB0 - 0xBF */ X, X, X, X, X, X, X, X, @@ -366,28 +366,17 @@ int gpf_emulate_4gb(struct xen_regs *regs) if ( !(decode & HAS_MODRM) ) { - switch ( decode & 7 ) - { - case 1: - if ( get_user(b, pb) ) - { - DPRINTK("Fault while extracting .\n"); - goto page_fault; - } - pb++; - offset = (signed long)(signed char)b; - goto skip_modrm; - case 4: - if ( get_user(offset, (u32 *)pb) ) - { - DPRINTK("Fault while extracting .\n"); - goto page_fault; - } - pb += 4; - goto skip_modrm; - default: + if ( (decode & 7) != 4 ) goto fail; + + if ( get_user(offset, (u32 *)pb) ) + { + DPRINTK("Fault while extracting .\n"); + goto page_fault; } + pb += 4; + + goto skip_modrm; } /* -- 2.30.2